package Day15;

/**
 * @Author kalista
 * @Description
 * @Date 2020/11/23  15:34
 **/
public class Account {


    private double money;
    private String name;


    public Account(double money, String name) {
        this.money = money;
        this.name = name;
    }

    public Account() {
    }

    public double getMoney() {
        return money;
    }

    public void setMoney(double money) {
        this.money = money;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Account{" +
                "money=" + money +
                ", name='" + name + '\'' +
                '}';
    }


    /**
     * 取钱
     * @param money
     */
    public void withdrawMoney(double money){

        // 怎么解决    排队
        // 线程的共享对象
        /**
         *
         * t1 t2 t3 t4 t5 5个线程
         * 你只希望 t1 t2  t3  排队   t4  t5 不需要排队怎么办？
         * 你一定要在（）里面写t1 t2 t3共享对象 ，而这个对象对于 t4   t5 不共享
         * 这个对象相对于t4 t5 来说不共享
         * 账户对象
         *
         *
         * 对象锁： 1个对象一把锁  100个对象100吧锁
         * 类锁： 100个对象 。 也可能是1吧锁
         *
         * 执行原理：
         * 1. 假如 t1 和 t2 并发。开始执行下面这个代码的时候是不是一个一个一个执行 一个先一个后
         * 假如 t1 执行到了 ，遇到了synchronized 这个时候自动找这个 后面的共享对象 的对象锁 找到之后 。 并且他要占有这把锁，
         * 然后区执行同步代码。在程序执行的过程中一直占有这把锁，直到同步代码结束之后。 这把锁才会被释放。
         *
         * 但是这个括号里面
         *
         */

//        synchronized ("123132") {
//        synchronized (obj) {
//        Object obj = null; //NullPointerException
        //局部变量
//         Object obj = new Object();
        synchronized (this) {
            // 减钱
            double newMoney = this.money - money;
            // 更新钱
            setMoney(newMoney);
        }
    }


}
